package com.cheer.ba.app;

import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.multidex.MultiDexApplication;
import android.util.Log;

import com.aliyun.common.httpfinal.QupaiHttpFinal;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.cheer.ba.BuildConfig;
import com.cheer.ba.app.oss.OssManager;
import com.cheer.ba.choosepic.util.Res;
import com.cheer.ba.constant.Constants;
import com.cheer.ba.service.LocationService;
import com.cheer.ba.utils.SystemUtils;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.pingplusplus.android.Pingpp;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.crashreport.CrashReport;
import com.umeng.socialize.Config;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;

import cn.jpush.android.api.JPushInterface;
import cn.smssdk.SMSSDK;


public class App extends MultiDexApplication {

    public static final String TAG = "App";

    private static App instance;

    public static int DEBUG_LEVEL = 0;

    public static boolean isDebug = BuildConfig.isDebug;

    public static int isFlag = BuildConfig.isFlag;

    public static int isOss = BuildConfig.oss_type;

    //是否调用注册大礼包 1调用
    public static int REGISTER_GIFT = 0;

    //定位服务
    public LocationService mLocationService;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
        instance = this;
        String processName = SystemUtils.getProcessName(this);
        String packageName = getPackageName();
        Log.d(TAG, "package:" + packageName);
        Log.d(TAG, "process:" + processName);
        //判断当前进程名是否和包名一致，避免多次初始化
        if (packageName.equals(processName)) {
            //禁止数据加密，可能会导致数据乱码问题
            asyncInit();
        }
    }

    private void asyncInit() {
        Res.init(this);
        //内存泄漏监测
        configLeakCanary();
        //卡顿监测
        configBlockCanary();
        //拦截崩溃
        configCrashHandler();
        //友盟配置
        configUmeng();
        //腾讯bugly崩溃监测
        configBugly();
        //防止修改系统字体
        fitFont();
        //极光推送初始化
        configJpush();
        //短信验证码初始化
        configSMSSDK();
        //ping++第三方支付
        configPingPay();
        //百度地图
        configBaiduMap();
        configImageLoad();
        configVideo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                OssManager.initUpload(instance);
            }
        }).start();
    }

    /**
     * 初始化短视频拍摄
     */
    private void configVideo() {
//        loadLibs();
//        QupaiHttpFinal.getInstance().initOkHttpFinal();
    }

    private void loadLibs() {
        System.loadLibrary("QuCore-ThirdParty");
        System.loadLibrary("QuCore");
    }

    /**
     * 初始化imageloader
     */
    private void configImageLoad() {
        //创建默认的ImageLoader配置参数
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration
                .createDefault(this);

        //Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(configuration);
    }

    /**
     * 百度地图初始化
     */
    private void configBaiduMap() {
        /***
         * 初始化定位sdk，建议在Application中创建
         */
        mLocationService = new LocationService(getApplicationContext());
        // 在使用 SDK 各组间之前初始化 context 信息，传入 ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起，百度地图SDK所有接口均支持百度坐标和国测局坐标，用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标，默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }

    private void configPingPay() {
        //是否开启日志
        Pingpp.enableDebugLog(App.isDebug);
    }


    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.d(TAG, "onLowMemory");
    }

    /**
     * 友盟配置
     */
    public void configUmeng() {
        Log.d(TAG, "configUmeng");

        Config.DEBUG = true;
        UMShareAPI.get(this);
//        MobclickAgent.setDebugMode(App.isDebug);
//        MobclickAgent.openActivityDurationTrack(false);
//        MobclickAgent.startWithConfigure(new MobclickAgent.UMAnalyticsConfig(getContext(), Constants.UMeng.APP_KEY, "", MobclickAgent.EScenarioType.E_UM_NORMAL));

        // QQ和Qzone appid appkey
        PlatformConfig.setQQZone(Constants.QQ.APP_ID, Constants.QQ.APP_KEY);

        //微信 appid appsecret
        PlatformConfig.setWeixin(Constants.WeiXin.APP_ID, Constants.WeiXin.APP_SECRET);

        //新浪微博 appkey appsecret
        PlatformConfig.setSinaWeibo(Constants.Sina.APP_KEY, Constants.Sina.APP_SECRET, Constants.Sina.REDIRECT_URL);
    }

    /**
     * 卡顿监测
     */
    private void configBlockCanary() {
        Log.d(TAG, "configBlockCanary");
//        if (isDebug) {
//        BlockCanary.install(getApplicationContext(), new AppBlockCanaryContext()).start();
//        }
    }

    /**
     * 内存泄漏监测
     */
    private void configLeakCanary() {
        Log.d(TAG, "configLeakCanary");
//        if (isDebug) {
//        refWatcher = LeakCanary.install(this);
//        }
    }

    /**
     * 极光推送初始化
     */
    private void configJpush() {
//        Intent i1 = new Intent(getApplicationContext(), ListenerService.class);
//        startService(i1);
//
//        Intent i2 = new Intent(getApplicationContext(), MainService.class);
//        startService(i2);
        JPushInterface.setDebugMode(true);    // 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);            // 初始化 JPush
//        JPushInterface.setSilenceTime(getContext(), 22, 30, 7, 30);
//        JPushInterface.setLatestNotificationNumber(getContext(), 10);
    }

    /**
     * 初始化短信验证码获取
     */
    private void configSMSSDK() {
        SMSSDK.initSDK(this, Constants.SMSSDK.APP_ID, Constants.SMSSDK.APP_KEY);
    }

    /**
     * 拦截崩溃
     */
    private void configCrashHandler() {
        if (isDebug) {
//            CrashHandler crashHandler = CrashHandler.getInstance();
//            crashHandler.init();
        }
    }

    /**
     * 腾讯bugly崩溃监测,版本升级
     */
    private void configBugly() {
        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
        //设置渠道
//        strategy.setAppChannel("");
        //App的版本
//        strategy.setAppVersion("1.0.0");
        //App的包名
//        strategy.setAppPackageName("com.cheer.ba");
        //设置Bugly初始化延迟：
        strategy.setAppReportDelay(10000);
        // 上报后的Crash会显示该标
        CrashReport.setUserSceneTag(getApplicationContext(), 0407);
        /**** Beta高级设置*****/
        /**
         * true表示app启动自动初始化升级模块；.
         * false不好自动初始化
         * 开发者如果担心sdk初始化影响app启动速度，可以设置为false
         * 在后面某个时刻手动调用
         */
//        Beta.autoInit = false;
        /**
         * true表示初始化时自动检查升级.
         * false表示不会自动检查升级，需要手动调用Beta.checkUpgrade()方法
         */
//        Beta.autoCheckUpgrade = false;
        /**
         * 设置升级周期为60s（默认检查周期为0s），60s内SDK不重复向后天请求策略.
         */
//        Beta.initDelay = 3 * 1000;

        /**
         * 设置通知栏大图标，largeIconId为项目中的图片资源；.
         */
//        Beta.largeIconId = R.mipmap.logo;

        /**
         * 设置状态栏小图标，smallIconId为项目中的图片资源id;.
         */
//        Beta.smallIconId = R.mipmap.logo;
        /**
         * 设置更新弹窗默认展示的banner，defaultBannerId为项目中的图片资源Id;.
         * 当后台配置的banner拉取失败时显示此banner，默认不设置则展示“loading“;
         */
//        Beta.defaultBannerId = R.mipmap.ic_launcher;
        /**
         * 设置sd卡的Download为更新资源保存目录;.
         * 后续更新资源会保存在此目录，需要在manifest中添加WRITE_EXTERNAL_STORAGE权限;
         */
//        Beta.storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        /**
         * 点击过确认的弹窗在APP下次启动自动检查更新时会再次显示;.
         */
//        Beta.showInterruptedStrategy = true;

        /**
         * 只允许在MainActivity上显示更新弹窗，其他activity上不显示弹窗;.
         * 不设置会默认所有activity都可以显示弹窗;
         */
//        Beta.canShowUpgradeActs.add(MainAty.class);
//        Beta.canShowUpgradeActs.add(SettingAty.class);

        /**
         *  设置自定义升级对话框UI布局.
         *  注意：因为要保持接口统一，需要用户在指定控件按照以下方式设置tag，否则会影响您的正常使用：
         *  标题：beta_title，如：android:tag="beta_title"
         *  升级信息：beta_upgrade_info  如： android:tag="beta_upgrade_info"
         *  更新属性：beta_upgrade_feature 如： android:tag="beta_upgrade_feature"
         *  取消按钮：beta_cancel_button 如：android:tag="beta_cancel_button"
         *  确定按钮：beta_confirm_button 如：android:tag="beta_confirm_button"
         *  详见layout/upgrade_dialog.xml
         */
//        Beta.upgradeDialogLayoutId = R.layout.upgrade_dialog;
        /**
         * 设置自定义tip弹窗UI布局.
         * 注意：因为要保持接口统一，需要用户在指定控件按照以下方式设置tag，否则会影响您的正常使用：
         *  标题：beta_title，如：android:tag="beta_title"
         *  提示信息：beta_tip_message 如： android:tag="beta_tip_message"
         *  取消按钮：beta_cancel_button 如：android:tag="beta_cancel_button"
         *  确定按钮：beta_confirm_button 如：android:tag="beta_confirm_button"
         *  详见layout/tips_dialog.xml
         */
//        Beta.tipsDialogLayoutId = R.layout.tips_dialog;
        /**
         *  如果想监听升级对话框的生命周期事件，可以通过设置OnUILifecycleListener接口.
         *  回调参数解释：
         *  context - 当前弹窗上下文对象
         *  view - 升级对话框的根布局视图，可通过这个对象查找指定view控件
         *  upgradeInfo - 升级信息
         */
//        Beta.upgradeDialogLifecycleListener = new UILifecycleListener<UpgradeInfo>() {
//            @Override
//            public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onCreate");
//                // 注：可通过这个回调方式获取布局的控件，如果设置了id，可通过findViewById方式获取，如果设置了tag，可以通过findViewWithTag，具体参考下面例子:
//
//                ImageView imageView = (ImageView) view.findViewWithTag(Beta.TAG_IMG_BANNER);
//
//                // 更多的操作：比如设置控件的点击事件
//                imageView.setOnClickListener(new View.OnClickListener() {
//                    @Override
//                    public void onClick(View v) {
//                        ToastUtil.showToast("点击了banner");
//                    }
//                });
//            }
//
//            @Override
//            public void onStart(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onStart");
//            }
//
//            @Override
//            public void onResume(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onResume");
//            }
//
//            @Override
//            public void onPause(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onPause");
//            }
//
//            @Override
//            public void onStop(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onStop");
//            }
//
//            @Override
//            public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) {
//                Log.d(TAG, "onDestory");
//            }
//        };

        /* 设置更新状态回调接口 */
//        Beta.upgradeStateListener = new UpgradeStateListener() {
//            @Override
//            public void onUpgradeSuccess(boolean isManual) {
//                Toast.makeText(getApplicationContext(), "UPGRADE_SUCCESS", Toast.LENGTH_SHORT).show();
//            }
//
//            @Override
//            public void onUpgradeFailed(boolean isManual) {
//                Toast.makeText(getApplicationContext(), "UPGRADE_FAILED", Toast.LENGTH_SHORT).show();
//            }
//
//            @Override
//            public void onUpgrading(boolean isManual) {
//                Toast.makeText(getApplicationContext(), "UPGRADE_CHECKING", Toast.LENGTH_SHORT).show();
//            }
//
//            @Override
//            public void onDownloadCompleted(boolean b) {
//                Toast.makeText(getApplicationContext(), "onDownloadCompleted", Toast.LENGTH_SHORT).show();
//
//            }
//
//            @Override
//            public void onUpgradeNoVersion(boolean isManual) {
//                Toast.makeText(getApplicationContext(), "UPGRADE_NO_VERSION", Toast.LENGTH_SHORT).show();
//            }
//        };

        /**
         * wifi下自动下载
         */
//        Beta.autoDownloadOnWifi = false;
        /**
         * 是否显示弹窗apk信息（默认弹窗）
         */
//        Beta.canShowApkInfo = true;

        Bugly.init(getApplicationContext(), Constants.Bugly.APP_ID, isDebug, strategy);
    }

    /**
     * 防止修改系统字体
     */
    private void fitFont() {
        Resources res = getResources();
        Configuration config = new Configuration();
        config.setToDefaults();
        res.updateConfiguration(config, res.getDisplayMetrics());
    }

    public static App getInstance() {
        return instance;
    }

    public static Context getContext() {
        if (instance != null) {
            return instance.getApplicationContext();
        }
        return null;
    }

    public static void exit() {
        AppManager.finishAll();
    }
}
